Pandas 简介
这个是学习tensorflow前的准备,
pandas 是一种列存数据分析 API。它是用于处理和分析输入数据的强大工具,很多机器学习框架都支持将 pandas 数据结构作为输入。 虽然全方位介绍 pandas API 会占据很长篇幅,但它的核心概念非常简单,我们会在下文中进行说明。有关更完整的参考,请访问 pandas 文档网站,其中包含丰富的文档和教程资源。
基本概念
导入pandas 并输出版本
from __future__ import print_function
import pandas as pd
print(pd.__version__)
0.23.4
pandas中的主要数据结构被时限为一下两类:
DataFrame: 一个关系型数据表格,其中包含多行和已命名的列,就像excel一样
Series:它是单独的一列,DataFrame中包含一个或多个Series,每个Series都有一个名称。就像我们写个表格在第一列写上每一行代表什么一样。
数据框架是用于数据操控的一种常用抽象实现形式,spark中的rdd,数据库中的table 类似。
创建Series的一种方法是构建Series对象。列入:
pd.Series(['Beijing', 'Shanghai', 'Shenzhen'])
你可以将映射string列名称的dict传递到它们各自的Series,从而创建DataFrame对象。如果Series在长度上不一致,系统会用特殊的NA值填充缺失的值。
city_names = pd.Series(['Beijing', 'Shanghai', 'Shenzhen'])
population = pd.Series([21534678, 23541023, 120456])
data = pd.DataFrame({'City name': city_names, 'Population': population})
print(data)
City name Population
0 Beijing 21534678
1 Shanghai 23541023
2 Shenzhen 120456
大多数情况下,我们需要把整个文件加载到DataFrame中,下面我们加载一个包含加利福尼亚州住房的数据文件。并创建特征定义,通过head方法浏览DataFrame前几个纪录
california_housing_dataframe = pd.read_csv("https://download.mlcc.google.cn/mledu-datasets/california_housing_train.csv", sep=",")
california_housing_dataframe.describe()
print(california_housing_dataframe.head())
longitude latitude ... median_income median_house_value
0 -114.31 34.19 ... 1.4936 66900.0
1 -114.47 34.40 ... 1.8200 80100.0
2 -114.56 33.69 ... 1.6509 85700.0
3 -114.57 33.64 ... 3.1917 73400.0
4 -114.57 33.57 ... 1.9250 65500.0
[5 rows x 9 columns]
pandas的另一个强大的功能是绘图制表,借助DataFrame.hist,可以快速了解一个列中值的分布。pandas使用的画图库是matplotlib所以我们也可以使用这个库中的方法来操作图表。
import matplotlib.pyplot as plt
hist = california_housing_dataframe.hist('housing_median_age')
plt.show()

访问数据
可以使用 dict 或list 的方法来访问DataFrame数据
cities = pd.DataFrame({'City name': city_names, 'Population': population})
print(type(cities['City name']))
print(cities['City name'])
print(type(cities['City name'][1]))
print(cities['City name'][1])
print(type(cities[0:2]))
print(cities[0:2])
<class 'pandas.core.series.Series'>
0 Beijing
1 Shanghai
2 Shenzhen
Name: City name, dtype: object
<class 'str'>
Shanghai
<class 'pandas.core.frame.DataFrame'>
City name Population
0 Beijing 21534678
1 Shanghai 23541023
操控数据
可以向series应用Python的基本用算指令。
population / 1000
0 21534.678
1 23541.023
2 120.456
NumPy是一个用于科学计算的常用工具包。pandas series可作用大多数NumPy函数的参数。
import numpy as np
np.log(population)
0 13.655892
1 13.831172
2 13.092314
dtype: float64
对于更加复杂的单列转换,可以使用Series.apply。像Python映射函数一样,Series.apply将以参数形式接受lambda函数,而该函数会应用与每个值,下面的例子是创建一个population是否超过一定数值的series。
print(population.apply(lambda val: val > 1000000))
0 True
1 True
2 False
dtype: bool
DataFrames的修改方式也非常简单。例如,一下代码向现有的DataFrame添加了两个Series。
cities['Area square miles'] = pd.Series([98.87, 176.53, 46.92]) # 随便写的数
cities['Population density'] = cities['Population'] / cities['Area square miles']
print(cities)
City name ... Population density
0 Beijing ... 217808.010519
1 Shanghai ... 133354.234408
2 Shenzhen ... 2567.263427
练习1
通过添加一个新的布尔值列,修改cities表格
城市以sh开头
城市面积大于50 (上面数都是我随便写的)
注意:布尔值 Series 1 辑与时,应使用 &,而不是 and。
cities['Is wide and has Sh name'] = (cities['Area square miles'] > 50) & cities['City name'].apply(lambda name: name.startswith('Sh'))
print(cities)
City name ... Is wide and has Sh name
0 Beijing ... False
1 Shanghai ... True
2 Shenzhen ... False
[3 rows x 5 columns]
索引
Series和DataFrame对象也定义了index属性,改属性向每个Series项或DataFrame行赋一个标识符值。默认情况下,在构造时,pandas会赋可反应数据源数据顺序的索引值。索引值在创建后时稳定的;也就是说,他们不会因为数据重新排序而发生改变。
print(city_names.index)
RangeIndex(start=0, stop=3, step=1)
print(cities.index)
RangeIndex(start=0, stop=3, step=1)
print(cities.reindex([2, 0, 1]))
City name ... Is wide and has Sh name
2 Shenzhen ... False
0 Beijing ... False
1 Shanghai ... True
[3 rows x 5 columns]
print(cities.reindex(np.random.permutation(cities.index)))
City name ... Is wide and has Sh name
0 Beijing ... False
2 Shanghai ... True
1 Shenzhen ... False
[3 rows x 5 columns]
练习2
reindex方法允许使用未包含在原始DataFrame索引值中的索引值。请示一下,看看如果使用此类值会发生什么。
如果reindex输入数组包含原始DataFrame索引值中没有的值,reindex会为此类“丢失的”索引添加新行,并在所有对应列中填充NaN值
cities.reindex([0,4,5,2])
City name ... Is wide and has Sh name
0 Beijing ... False
4 NaN ... NaN
5 NaN ... NaN
2 Shenzhen ... False
[4 rows x 5 columns]
这种行为是可取的,因为索引通常是从实际数据中提取的字符串,在这种情况下,如果容许出现“丢失的”索引,将可以轻松的使用外部列表重建索引,因为我们不必担心将输入清理掉。